#include"Queue.h"

#include<stdio.h>
#include<assert.h>
#include<malloc.h>

//申请一个节点
QNode* buyQNode(QDataType data)
{
  QNode *newnode=(QNode*)malloc(sizeof(QNode));
  if(NULL==newnode)
  {
    assert(0);
    return NULL;
  }
  newnode->data=data;
  newnode->next=NULL;
  return newnode;
}

//初始化队列 
void QueueInit(Queue* q)
{
  assert(q);
  q->front=q->rear=NULL;
  q->size=0;
  
}
// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
  assert(q);
  QNode *newnode=buyQNode(data);
  if(NULL==q->front)
  {
    q->front=newnode; 
  }
  else
  {
    q->rear->next=newnode; 
  }
  q->rear=newnode;
  q->size++;
}
// 队头出队列 
void QueuePop(Queue* q)
{
  assert(q);
  if(QueueEmpty(q))
  {
    return;
  }
  else
  {
    QNode *delndoe=q->front;
    q->front=delndoe->next;
    free(delndoe);
    if(NULL==q->front)
    {
      q->rear=NULL;
    }
  }
  q->size--;
}
// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
  assert(!QueueEmpty(q));
  return q->front->data;
}
// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
  assert(!QueueEmpty(q));
  return q->rear->data;
}
// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
  assert(!QueueEmpty(q));
  return q->size;
}
// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
int QueueEmpty(Queue* q)
{
  assert(q);
  return NULL==q->front;
}
// 销毁队列 
void QueueDestroy(Queue* q)
{
  assert(q);
  QNode *cur=q->front;
  while(cur)
  {
    q->front=cur->next;
    free(cur);
    cur=q->front;
  }
  q->rear=NULL;
  q->size=0;
}

/////////////////////////////////////////////
void TestQueue()
{
  Queue q;
  QueueInit(&q);
  QueuePush(&q, 1);
  QueuePush(&q, 2);
  QueuePush(&q, 3);
  QueuePush(&q, 4);
  QueuePush(&q, 5);
  printf("%d\n", QueueFront(&q));
  printf("%d\n", QueueBack(&q));
  printf("%d\n", QueueSize(&q));

  QueuePop(&q);
  QueuePop(&q);
  QueuePop(&q);
  printf("%d\n", QueueFront(&q));
  printf("%d\n", QueueBack(&q));
  printf("%d\n", QueueSize(&q));

  QueuePop(&q);
  QueuePop(&q);
  QueuePop(&q);

  if(QueueEmpty(&q))
  {
    printf("队列已经为空\n");
  }
  else{
    printf("队列不为空\n");
  }
  QueueDestroy(&q);
}
